package com.whcoding.test.common.excel;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.whcoding.test.pojo.ExportViewVO;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
 * Excel导入导出模板
 *
 * @author: gexupeng 2018/6/15 14:26
 **/
public class ExcelUtilsTemp {

	//title
	public static final String ExportExcel_TITLE = "title";
	//entity
	public static final String ExportExcel_ENTITY = "entity";
	//data
	public static final String ExportExcel_DATA = "data";


	static Logger log = LoggerFactory.getLogger(ExcelUtils.class);

	/**
	 *
	 * @param list 数据源
	 * @param title 标题
	 * @param sheetName sheetName
	 * @param pojoClass PO JO
	 * @param fileName 文件名称
	 * @param isCreateHeader 是否创建首行
	 * @param response
	 */
	public static void exportExcelTemp(List<?> list, String title,
									   String sheetName,
									   Class<?> pojoClass,
									   String fileName,
									   boolean isCreateHeader,
									   HttpServletResponse response) {
		ExportParams exportParams = new ExportParams(title, sheetName);
		exportParams.setCreateHeadRows(isCreateHeader);
		defaultExport(list, pojoClass, fileName, response, exportParams);

	}

	public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {
		defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
	}

	public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
		defaultExport(list, fileName, response);
	}

	private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
		Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
		if (workbook != null) ;
		downLoadExcel(fileName, response, workbook);
	}


	private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
		try {
			response.setCharacterEncoding("UTF-8");
			response.setHeader("content-Type", "application/vnd.ms-excel");
			response.setHeader("Content-Disposition",
					"attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
			workbook.write(response.getOutputStream());
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		}
	}

	private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
		Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
		if (workbook != null) ;
		downLoadExcel(fileName, response, workbook);
	}

	public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
		if (StringUtils.isBlank(filePath)) {
			return null;
		}
		ImportParams params = new ImportParams();
		params.setTitleRows(titleRows);
		params.setHeadRows(headerRows);
		List<T> list = null;
		try {
			list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
		} catch (NoSuchElementException e) {
			log.error(e.getMessage(), "模板不能为空");
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(), e);
		}
		return list;
	}

	public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
		if (file == null) {
			return null;
		}
		ImportParams params = new ImportParams();
		params.setTitleRows(titleRows);
		params.setHeadRows(headerRows);
		List<T> list = null;
		try {
			list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
		} catch (NoSuchElementException e) {
			log.error(e.getMessage(), "excel文件不能为空");
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return list;
	}

	public static void exportMoreSheetExcel(List<ExportViewVO> list, String fileName, HttpServletResponse response) {
		List<Map<String, Object>> exportParamList = new ArrayList<>();
		list.forEach(t -> {
			Map<String, Object> valueMap = new HashMap<>();
			valueMap.put(ExportExcel_TITLE, t.getExportParams());
			valueMap.put(ExportExcel_ENTITY, t.getCls());
			valueMap.put(ExportExcel_DATA, t.getDataList());
			exportParamList.add(valueMap);
		});
		Workbook workbook = ExcelExportUtil.exportExcel(exportParamList, ExcelType.HSSF);
		if (workbook != null) {
			downLoadExcel(fileName, response, workbook);
		}
	}



	/**
	 * 下载模板公共方法
	 * @param response
	 * @param fileName
	 * @param inputStream
	 * @throws IOException
	 */
	public static void downloadTemplate(HttpServletResponse response, String fileName, InputStream inputStream) throws IOException {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			response.setContentType("application/x-msdownload;");
			response.setHeader("Content-disposition", "attachment; filename="
					+ new String(fileName.getBytes("ISO8859-1"), StandardCharsets.UTF_8));
			bis = new BufferedInputStream(inputStream);
			bos = new BufferedOutputStream(response.getOutputStream());
			byte[] buff = new byte[2048];
			int bytesRead;
			while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
				bos.write(buff, 0, bytesRead);
			}
		} catch (Exception e) {
			log.error("下载模板失败",e);
		} finally {
			if (bis != null){
				bis.close();
			}
			if (bos != null){
				bos.close();
			}
		}
	}


}
